#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
/*
 int fseek(FILE *stream, long offset, int whence);
       功能：移动文件光标位置，将光标从指定位置处进行前后偏移
       参数1：文件指针
       参数2：偏移量
            >0:表示从指定位置向后偏移n个字节
            <0:表示从指定位置向前偏移n个字节
            =0:在指定位置处不偏移
        参数3：偏移的起始位置
            SEEK_SET：文件起始位置
            SEEK_CUR：文件指针当前位置
            SEEK_END：文件结束位置
        返回值：成功返回0，失败返回-1并置位错误码

       long ftell(FILE *stream);
       功能：获取文件指针当前的偏移量
       参数：文件指针
       返回值：成功返回文件指针所在的位置，失败返回-1并置位错误码
       eg: fseek(fp, 0, SEEK_END);        //将光标定位在结尾
           ftell(fp);                //该函数的返回值，就是文件大小

       void rewind(FILE *stream);
       功能：将文件光标定位在开头,和fseek(fp, 0, SEEK_SET);等价
       参数：文件指针
       返回值：无
*/
// 定义一个学生信息
class Stu
{
public:
    char name[20];
    int age;
    double score;
};

int main(int argc, const char *argv[])
{
    // 定义文件指针，以只写的形式打开文件
    FILE *fp = NULL;
    if ((fp = fopen("./test.txt", "w+")) == NULL)
    {
        perror("fopen error");
        return -1;
    }
    // 定义三个学生
    Stu s[3] = {{"张三", 18, 98},
                {"李四", 20, 88},
                {"王五", 16, 95}};
    // 将三个学生信息写入文件中
    fwrite(s, sizeof(Stu), 3, fp);
    // 求出文件的大小
    printf("此时文件的大小为：%ld\n", ftell(fp));
    // 将光标移动到开头位置
    // fseek(fp, 0, SEEK_SET);
    // 将光标直接定位到第二个学生信息前，但是此时光标在最后
    // fseek(fp, sizeof(Stu), SEEK_SET);
    // 文件大小
    // 将光标从开头后移一个学生空间的内容
    fseek(fp, -sizeof(Stu) * 2, SEEK_CUR);
    // 定义一个对象，接收读取的结果
    Stu temp;
    // 从文件中读取一个学生的信息
    fread(&temp, sizeof(Stu), 1, fp);
    // 将光标从当前位置向前偏移两个学生空间的内容
    // 将读取的数据展示出来
    printf("name:%s, age:%d, score:%.2lf\n", temp.name, temp.age, temp.score);
    // 关闭文件
    fclose(fp);
    return 0;
}